package ErgebnisFilterung;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.util.Log;

import com.main.antenne.AntenneIntent;

public class DatenFilter extends Thread {

	private ArrayList<Liga> ligenListe = new ArrayList<Liga>();
	private ArrayList<Spiel> spieleListe = new ArrayList<Spiel>();
	private ArrayList<TabellenEintrag> tabellenListe = new ArrayList<TabellenEintrag>();

	private static int spieltagAnzahl, aktuellerSpieltag;
	private Semaphore zuAktualisieren = new Semaphore(0);
	private String filtertyp;
	private int gewählterSpieltag;
	private Activity activity;

	public DatenFilter(Activity activity, String filtertyp) {
		this.filtertyp = filtertyp;
		this.activity = activity;
	}

	public DatenFilter(Activity activity, String filtertyp,
			int spieltagFürErgebnisFilterung) {
		this.filtertyp = filtertyp;
		this.gewählterSpieltag = spieltagFürErgebnisFilterung;
		this.activity = activity;
	}

	public ArrayList<Liga> filtereLigen() throws IOException, JSONException {
		ArrayList<Liga> liste = new ArrayList<Liga>();

		URL link = new URL("http://www.dieantenne.it/snExp"
				+ AntenneIntent.getSportart() + ".php");
		HttpURLConnection connection = (HttpURLConnection) link
				.openConnection();

		connection.setRequestMethod("GET");
		connection.setUseCaches(false);
		BufferedReader in = new BufferedReader(new InputStreamReader(
				connection.getInputStream()));

		String response = in.readLine();

		JSONArray jsonArray = new JSONArray(response);
		for (int i = 0; i < jsonArray.length(); i++) {
			JSONObject jo = jsonArray.getJSONObject(i);
			Liga l = new Liga();

			l.setName(jo.getString("Name"));
			l.setSaison(jo.getString("saison"));
			l.setAbkuerzung(jo.getString("liga"));
			liste.add(l);
		}

		return liste;
	}

	public ArrayList<Spiel> filtereErgebnisse() throws IOException,
			JSONException {
		URL link;
		if (gewählterSpieltag == 0) {
			link = new URL("http://www.dieantenne.it/snExpSpieltag.php?sport="
					+ AntenneIntent.getSportart() + "&liga="
					+ AntenneIntent.getLiga() + "&saison="
					+ AntenneIntent.getSaison());
		} else {
			link = new URL("http://www.dieantenne.it/snExpSpieltag.php?sport="
					+ AntenneIntent.getSportart() + "&liga="
					+ AntenneIntent.getLiga() + "&saison="
					+ AntenneIntent.getSaison() + "&varSpieltag="
					+ gewählterSpieltag);
		}

		HttpURLConnection connection = (HttpURLConnection) link
				.openConnection();
		connection.setRequestMethod("GET");
		connection.setUseCaches(false);
		BufferedReader in = new BufferedReader(new InputStreamReader(
				connection.getInputStream()));

		String response = in.readLine();

		JSONArray jsonArray = new JSONArray(response);
		for (int i = 0; i < jsonArray.length(); i++) {
			JSONObject jo = jsonArray.getJSONObject(i);
			Spiel spiel = new Spiel();

			if (jo.getString("Heim").toLowerCase().contains("spielfrei")
					|| jo.getString("Gast").toLowerCase().contains("spielfrei")) {
				// Mannschaft, die spielfrei hat
				spiel.setDatum(spieleListe.get(spieleListe.size() - 1)
						.getDatum());
				spiel.setZeit(jo.getString("Zeit"));
				spiel.setOrt("/");
				if (jo.getString("Heim").equals("spielfrei")) {
					spiel.setHeim(jo.getString("Gast"));
					spiel.setGast("SPIELFREI");
				} else if (jo.getString("Gast").equals("spielfrei")) {
					spiel.setHeim(jo.getString("Heim"));
					spiel.setGast("SPIELFREI");
				}
				spiel.setErgebnis("/");
			} else {
				// Nicht spielfrei
				spiel.setDatum(jo.getString("Datum"));
				spiel.setZeit(jo.getString("Zeit"));
				spiel.setOrt(jo.getString("Ort"));
				spiel.setHeim(jo.getString("Heim"));
				spiel.setGast(jo.getString("Gast"));
				spiel.setErgebnis(fügeLeerzeichenInErgebnisHinzu(jo
						.getString("Ergebnis")));
				spiel.setTorschützenHeim(jo.getString("scoresHome"));
				spiel.setTorschützenGast(jo.getString("scoresGuest"));
				spiel.setLive(getLiveFromStatus(jo.getString("status")));
			}
			spiel.fuelleAnzeigeParameter();
			spieleListe.add(spiel);
		}

		aktuellerSpieltag = getAktSpieltag();

		spieleListe = sortiereSpieleNachDatum(spieleListe);
		spieltagAnzahl = spieleListe.size() * 4 - 2;

		return spieleListe;
	}

	public int getAktSpieltag() throws IOException {
		ArrayList<Integer> werte = new ArrayList<Integer>();

		try {
			URL link = new URL(
					"http://www.dieantenne.it/snExpTabelle.php?sport="
							+ AntenneIntent.getSportart() + "&liga="
							+ AntenneIntent.getLiga() + "&saison="
							+ AntenneIntent.getSaison());

			HttpURLConnection connection = (HttpURLConnection) link
					.openConnection();
			connection.setRequestMethod("GET");
			connection.setUseCaches(false);
			BufferedReader in = new BufferedReader(new InputStreamReader(
					connection.getInputStream()));

			String response = in.readLine();

			JSONArray jsonArray = new JSONArray(response);
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject jo = jsonArray.getJSONObject(i);
				werte.add(Integer.parseInt(jo.getString("Spiele")));
			}

		} catch (JSONException e) {
			e.printStackTrace();
		}
		int max = 0;
		for (Integer i : werte)
			if (i > max)
				max = i;
		if (werte.size() % 2 != 0)
			max++;
		return max;
	}

	public ArrayList<TabellenEintrag> filtereTabelle() throws IOException,
			JSONException {
		ArrayList<TabellenEintrag> liste = new ArrayList<TabellenEintrag>();

		URL link = new URL("http://www.dieantenne.it/snExpTabelle.php?sport="
				+ AntenneIntent.getSportart() + "&liga="
				+ AntenneIntent.getLiga() + "&saison="
				+ AntenneIntent.getSaison());

		HttpURLConnection connection = (HttpURLConnection) link
				.openConnection();
		connection.setUseCaches(false);
		BufferedReader in = new BufferedReader(new InputStreamReader(
				connection.getInputStream()));

		String response = in.readLine();

		JSONArray jsonArray = new JSONArray(response);
		for (int i = 0; i < jsonArray.length(); i++) {
			JSONObject jo = jsonArray.getJSONObject(i);
			TabellenEintrag t = new TabellenEintrag();

			t.setPosition(Integer.toString(i + 1));
			t.setTeam(jo.getString("Team"));
			t.setSpiele(jo.getString("Spiele"));
			t.setSiege(jo.getString("S"));
			t.setUnentschieden(jo.getString("U"));
			t.setNiederlagen(jo.getString("N"));
			t.setTore(jo.getString("Tore"));
			t.setGegentore(jo.getString("Gegentore"));
			t.setTordifferenz(jo.getString("Tordifferenz"));
			t.setPunkte(jo.getString("Punkte"));
			liste.add(t);
		}

		return liste;
	}

	@Override
	public void run() {
		if (filtertyp.equals("ligen")) {
			try {
				ligenListe = filtereLigen();
			} catch (Exception e) {
				e.printStackTrace();
			}
			zuAktualisieren.release();
		} else if (filtertyp.equals("spiele")) {
			try {
				spieleListe = filtereErgebnisse();
			} catch (Exception e) {
				e.printStackTrace();
			}
			zuAktualisieren.release();
		} else if (filtertyp.equals("tabelle")) {
			try {
				tabellenListe = filtereTabelle();
			} catch (Exception e) {
				e.printStackTrace();
			}
			zuAktualisieren.release();
		}
	}

	ArrayList<Spiel> sortiereSpieleNachDatum(ArrayList<Spiel> list) {
		boolean getauscht = true;
		while (getauscht) {
			getauscht = false;
			for (int i = 0; i < list.size() - 1; i++)
				if (list.get(i).datumFormatiert
						.after(list.get(i + 1).datumFormatiert)) {
					Spiel tempSpiel = list.get(i);
					list.set(i, list.get(i + 1));
					list.set(i + 1, tempSpiel);
					getauscht = true;
				}
		}
		return list;
	}

	public String fügeLeerzeichenInErgebnisHinzu(String wert) {
		for (int i = 0; i < wert.length(); i++)
			if (!Character.isDigit(wert.charAt(i)) && wert.charAt(i) != ':')
				return " : ";
		StringBuilder hilf = new StringBuilder(wert);
		Log.d("WERT", wert);
		hilf.insert(hilf.indexOf(":"), ' ');
		hilf.insert(hilf.indexOf(":") + 1, ' ');
		wert = hilf.toString();
		return wert;
	}

	/**
	 * Liefert einen boolean-Wert für den übergebenen Spiel-Status zurück.
	 * 
	 * @param status
	 *            der Status des Spiels (0=nicht live, 1=live)
	 * @return {@code true}, falls das Spiel live ist; {@code false}, falls das
	 *         Spiel nicht live ist.
	 */
	private static boolean getLiveFromStatus(String status) {
		if (status == null)
			// Status null
			return false;

		if (status.equals("0"))
			// Spiel nicht live
			return false;
		else if (status.equals("1"))
			// Spiel live
			return true;
		else
			// Falsche Angabe => Spiel nicht live
			return false;
	}

	public ArrayList<Liga> getLigenListe() {
		return ligenListe;
	}

	public Semaphore getZuAktualisieren() {
		return zuAktualisieren;
	}

	public ArrayList<Spiel> getSpieleListe() {
		return spieleListe;
	}

	public ArrayList<TabellenEintrag> getTabellenListe() {
		return tabellenListe;
	}

	public static int getSpieltagAnzahl() {
		return spieltagAnzahl;
	}

	public static void setSpieltagAnzahl(int spieltagAnzahl) {
		DatenFilter.spieltagAnzahl = spieltagAnzahl;
	}

	public static int getAktuellerSpieltag() {
		return aktuellerSpieltag;
	}

	public static void setAktuellerSpieltag(int aktuellerSpieltag) {
		DatenFilter.aktuellerSpieltag = aktuellerSpieltag;
	}

	public Activity getActivity() {
		return activity;
	}

}
